﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace AlgorithmTest
{
    // T_[四个数字排序]_[算法名]
    public class T_0118_GroupAnagrams : IAlgorithm
    {
        // 字母异位词分组

        // 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
        // 字母异位词 是由重新排列源单词的字母得到的一个新单词，所有源单词中的字母通常恰好只用一次。
           
        // 提示：
        //  1 <= strs.length <= 10^4
        //  0 <= strs[i].length <= 100
        //  strs[i] 仅包含小写字母

        public void Test()
        {
            // 算法参数定义
            var strs = new string[] { "eat", "tea", "tan", "ate", "nat", "bat" };
            // 算法执行与打印
            var res = GroupAnagrams(strs);
            foreach (var item in res)
            {
                foreach (var iitem in item)
                {
                    Console.Write(iitem + " ");
                }
                Console.WriteLine();
            }
        }

        // 算法
        public IList<IList<string>> GroupAnagrams(string[] strs)
        {
            var hashmap = new Dictionary<string,List<string>>();
            foreach (var str in strs)
            {
                var tempChars = str.ToCharArray();
                Array.Sort(tempChars);
                var keyStr = new string(tempChars);
                if (hashmap.ContainsKey(keyStr))
                    hashmap[keyStr].Add(str);
                else
                    hashmap.Add(keyStr, new List<string>() { str });
            }
            return new List<IList<string>>(hashmap.Values);
        }
    }
}
